package com.le.tester.imooc.ccmouse.recursion;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 描述：从数组中取出不同元素的各种组合(递归)
 */
public class Combinations {
    public void combinations(List<Integer> selected, List<Integer> data, int n) {
        //n==0，按照代码的思想应该是已经被选择完了，应该输出所有的全部组合
        //因为使用了递归，再次回到判断n的时候，已经选择了所需要返回的数据，注意使用了递归，n在递归中进行了传递
        //然而直接传递了一个0,那么表明选的话只会是空
        if (n == 0) {
            for (int i : selected) {
                System.out.print(i);
                System.out.print(" ");
            }
            System.out.println();
            return;
        }
        if (data.isEmpty()) {
            return;
        }
        selected.add(data.get(0));
        combinations(selected, data.subList(1, data.size()), n - 1);

        //也是定值是1,2,3,4；在[1,x],1就是定值了，那么所需要移除的就是selected.size()-1
        selected.remove(selected.size() - 1);
        combinations(selected, data.subList(1, data.size()), n);


    }

    public static void main(String[] args) {
        Combinations combinations = new Combinations();
        combinations.combinations(
                new ArrayList<>(), Arrays.asList(1, 2, 3, 4), 2);
        System.out.println("==========");
        combinations.combinations(
                new ArrayList<>(), new ArrayList<>(), 2);
        System.out.println("==========");
        combinations.combinations(
                new ArrayList<>(), new ArrayList<>(), 0);
        System.out.println("==========");
        combinations.combinations(
                new ArrayList<>(), Arrays.asList(1, 2, 3, 4), 1);
        System.out.println("==========");
        combinations.combinations(
                new ArrayList<>(), Arrays.asList(1, 2, 3, 4), 0);
        System.out.println("==========");
        combinations.combinations(
                new ArrayList<>(), Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 4);

    }
}
